import cv2
import socket
import time

# 配置参数
UDP_IP = "127.0.0.1"  # Java后端IP（本地测试用127.0.0.1）
UDP_PORT = 5001  # 与Java后端UDP监听端口一致
CAPTURE_WIDTH = 640  # 摄像头采集宽度
CAPTURE_HEIGHT = 480  # 摄像头采集高度
FPS = 15  # 帧率（控制发送速度）


def main():
    # 1. 打开摄像头
    cap = cv2.VideoCapture(0)  # 0表示默认摄像头，多摄像头可尝试1、2...
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, CAPTURE_WIDTH)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, CAPTURE_HEIGHT)

    if not cap.isOpened():
        print("无法打开摄像头，请检查设备是否正常")
        return

    # 2. 创建UDP套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    try:
        print(f"开始采集摄像头视频，通过UDP发送到 {UDP_IP}:{UDP_PORT}（按Ctrl+C停止）")
        while True:
            # 3. 读取一帧视频
            ret, frame = cap.read()
            if not ret:
                print("无法获取视频帧，退出")
                break

            # 4. 转为JPEG格式（压缩后发送，减少数据量）
            ret, buffer = cv2.imencode('.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 80])
            if not ret:
                print("帧编码失败，跳过")
                continue

            # 5. 通过UDP发送（JPEG二进制数据）
            udp_socket.sendto(buffer.tobytes(), (UDP_IP, UDP_PORT))

            # 控制帧率（避免发送过快）
            time.sleep(1.0 / FPS)

    except KeyboardInterrupt:
        print("用户中断，停止发送")
    finally:
        # 释放资源
        cap.release()
        udp_socket.close()
        print("资源已释放")


if __name__ == "__main__":
    main()